package com.kl.modular.base.service.api;


import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;

import java.io.Serializable;
import java.util.List;

/**
 * 公用SERVICE 接口
 *
 * 1、所有SERVICE接口需继承该接口
 * 2、主要作用提供公用SERVICE方法
 *
 * @author xr_zjb
 * @date 2017/06/07 09:35
 *
 */
public interface IBaseService<T> extends IService<T> {

    /**
     * 查询列表数据
     * @param entity 对象数据PO类 传入空对象将不进行查询操作
     * @return
     */
    List<T> selectListByEntity(T entity);

    /**
     * 查询列表数据
     * @param bo bo
     * @return
     */
    List<T> selectListByBo(Object bo);

    /**
     * 查询一个对象数据
     * @param entity
     * @return
     */
    T selectOneByEntity(T entity);

    /**
     * 查询一个对象数据
     * @param bo
     * @return
     */
    T selectOneByBo(Object bo);

    /**
     * 查询对象列表数据
     * @param wrapper
     * @return
     */
    List<T> selectListByWrapper(Wrapper<T> wrapper);

    /**
     * 查询一个对象数据
     * @param wrapper
     * @return
     */
    T selectOneByWrapper(Wrapper<T> wrapper);

    /**
     * 查询对象数据分页
     * @param page 分页数据
     * @param entity 对象数据PO类
     * @return
     */
    Page<T> selectPageByEntity(Page<T> page, T entity);

    /**
     * 查询对象数据分页
     * @param page 分页数据
     * @param bo 对象数据Bo类
     * @return
     */
    Page<T> selectPageByBo(Page<T> page, Object bo);

    /**
     * 逻辑删除
     * @param id 主键ID
     */
    void logicalDelete(Serializable id);

    /**
     * 批量逻辑删除
     * @param idList id集合
     */
    void logicalDeleteBatch(List<Serializable> idList);

    /**
     * 批量逻辑删除
     * @param ids ids字符串
     */
    void logicalDeleteBatch(String[] ids);

    /**
     * 物理删除数据
     * @param entity 对象数据PO
     */
    void deleteByEntity(T entity);

    /**
     * 记录数
     * @param entity 对象数据PO
     * @return
     */
    int selectCountByEntity(T entity);
}
